#include <types.h>
#include <kernel/system.h>
#include <kernel/initcall.h>
#include <drivers/irq.h>
#include <drivers/gpio.h>
#include <kernel/syslog.h>
#include <kernel/kobject.h>
#include <irqnum.h>
#include <drivers/uart.h>
#include <string.h>
#include <os/task.h>
#include <kernel/softirq.h>


static void delay(int delay)
{
    for(volatile int i = 0; i<delay; i++)
        for(volatile int j=0;j<1000;j++);
}


void test_exit_handler(void)
{
    SYSLOG_INFO("test_exit_handler!\n");
    gpio_toggle_value(IO_PC13);
}

void vTask2Code(void *pvParameters) {
    for(;;) { // 无限循环
        gpio_set_value(IO_PC13, 1);
        SYSLOG_INFO("vTask2Code!");
        task_delay(1000);
    }
}

void tasklet_test_handle(unsigned long data)
{
    SYSLOG_INFO("tasklet_test_handle! %d", data);
}


DECLARE_TASKLET(tasklet_test, tasklet_test_handle, 0);

void softirq_test_handle(void)
{
    SYSLOG_INFO("softirq_test_handle!");
}

// 第一个任务
void vTask1Code(void *pvParameters) {
    //task_create(vTask2Code, "Task 2", 256, NULL, 1);
    softirq_register(0, softirq_test_handle);
    tasklet_schedule(&tasklet_test);

    for(;;) { // 无限循环
        gpio_set_value(IO_PC13, 1);
        SYSLOG_INFO("vTask1Code!");
        //softirq_wakeup(0);
        tasklet_action(&tasklet_test, 123456);
        task_delay(1000);
    }
}


int main(void)
{
    int ret = gpio_request(IO_PA15);
    if(ret) {
        return 0;
    }

    gpio_direction_output(IO_PA15, IO_HIGH);

    gpio_set_value(IO_PA15, 1);

    // ret = gpio_request(IO_PA0);
    // if(ret) {
    //     gpio_set_value(IO_PC13, 0);
    //     return 0;
    // }

    // int irq = gpio_to_irq(IO_PA0, IRQF_RISING);
    // irq_request(irq, test_exit_handler);
    // irq_enable(irq);

    SYSLOG_INFO("system start!\n");

    task_create(vTask1Code, "Task 1", 256, NULL, 2);

    // 启动调度器
    task_start_scheduler();

    // 如果一切正常，这个点不会被执行
    while(1) {
        SYSLOG_INFO("system start!\n");
    }

    return 0;
}
